using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
  /*
  C# 中的委托（Delegate）类似于 C 或 C++ 中函数的指针。委托（Delegate）
  是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
  委托（Delegate）特别用于实现事件和回调方法。所有的委托（Delegate）都派生自 System.Delegate 类。

  声明：
  public delegate int MyDelegate (string s);
  delegate <return type> <delegate-name> <parameter list>

  实例化：
  public delegate void printString(string s);
  ...
  printString ps1 = new printString(WriteToScreen);
  printString ps2 = new printString(WriteToFile);
  */
  class TestDelegate
  {
    static int num = 10;
    public static int AddNum(int p)
    {
      num += p;
      return num;
    }

    public static int MultNum(int q)
    {
      num *= q;
      return num;
    }
    public static int getNum()
    {
      return num;
    }

    static void Main(string[] args)
    {
      // 创建委托实例
      NumberChanger nc1 = new NumberChanger(AddNum);
      NumberChanger nc2 = new NumberChanger(MultNum);
      // 使用委托对象调用方法
      nc1(25);
      Console.WriteLine("Value of Num: {0}", getNum());
      nc2(5);
      Console.WriteLine("Value of Num: {0}", getNum());
      Console.ReadKey();
    }
  }
}